﻿// Inner Fire 游戏引擎库
// UI Mesh管理器
//
// Copyright (c) 2024 by 尔西大帝. All rights reserved.
//
// 用于管理所有的UI MESH
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2024-12-24

#pragma once

#include <dx/ui/dx_layout.h>
#include <dx/ui/ui_canvas.h>
#include <dx/ui/ui_mesh.h>

namespace ifire::dx {

/// <summary>
/// 用于管理所有项目的类
/// </summary>
class UIMeshManager {
public:
  UIMeshManager(const UIMeshDesc& text_desc,
      const UIMeshDesc& image_desc, const UICanvasDesc& canvas_desc);
  UIMeshManager(const UIMeshManager& rhs) = delete;
  UIMeshManager& operator=(const UIMeshManager& rhs) = delete;
  ~UIMeshManager() = default;

  inline UIMesh* Text() { return text_.get(); }
  inline UIMesh* Image() { return image_.get(); }

  // 在池中创建一个文字
  DxText* CreateText(const DxTextDesc& desc, UIRenderItem* parent = nullptr);
  // 在池中创建一个图片
  DxImage* CreateImage(const DxImageDesc& desc, UIRenderItem* parent = nullptr);
  // 创建一个空的容器
  DxLayout* CreateLayout(
      const DxLayoutDesc& desc, UIRenderItem* parent = nullptr);

  // 更新屏幕的大小
  void OnResize(const UIWidget& widget) { canvas_->OnResize(widget); }

  // 更新文字
  void UpdateText(UploadBuffer<UIInstancedData>* uploader);
  // 更新图片
  void UpdateImage(UploadBuffer<UIInstancedData>* uploader);

  inline XMFLOAT2 ClientSize() const { return canvas_->mWidget.size; }


private:
  // 用于文字的项目
  std::unique_ptr<UIMesh> text_;
  // 用于图片的项目
  std::unique_ptr<UIMesh> image_;
  // 用于画布
  std::unique_ptr<UICanvas> canvas_;
  // 用于Layout容器
  eastl::vector<DxLayoutPtr> layouts_;
  // 当前项目的文字对象
  eastl::vector<DxTextPtr> text_items_;
  // 当前项目的图片对象
  eastl::vector<DxImagePtr> image_items_;
};
} // namespace ifire